package io.renren.common.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectResult;
import io.renren.common.config.BaseConstant;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;

/**
 * @author Singer create by singer email:313402703@qq.com
 * @projectName map-clothes-app-api
 * @Description: 阿里OSS文件操作
 * @date 2019-09-18
 */
@Component
public class AliOSSComponent {


    @Resource
    private BaseConstant baseConstant;


    /**
     * @description: 上传文件到OSS
     * @auther: create by singer - 王 浩 email:313402703@qq.com
     * @date 2019-09-18
     * @param file 文件
     * @param type 文件存储类型 1 oss-map-cloths-app-user-head #用户头像
     *                         2 oss-map-cloths-app-merchant-media #商户视频
     *                         3 oss-map-cloths-app-user-media #用户视频
     *                         4 oss-map-cloths-app-img #APP图像
     *                         5 oss-map-cloths-app-sys #存放系统静态图片资源或者视频
     */
    public String uploadOSSFile(MultipartFile file,Integer type) throws Exception{
        String name = file.getName();

        if(CheckParam.isNull(name) || file.getSize() <= 0L) return null;

        //文件原始名称
        String originalFilename = file.getOriginalFilename();
        if(type.compareTo(1) == 0){
            return streamToOSS(file.getInputStream(),
                    baseConstant.getAliOSSAPPUserFilePath()+"/"+ SnowflakeIdWorker.uniqueSequenceStr()+originalFilename);
        }
        /*if(type.compareTo(2) == 0){
            return streamToOSS(file.getInputStream(),
                    baseConstant.getAliOSSAPPMerchantMediaFilePath()+"/"+ SnowflakeIdWorker.uniqueSequenceStr()+originalFilename);
        }*/
        /*if(type.compareTo(3) == 0){
            return streamToOSS(file.getInputStream(),
                    baseConstant.getAliOSSAPPUserMediaFilePath()+"/"+ SnowflakeIdWorker.uniqueSequenceStr()+originalFilename);
        }*/
        /*if(type.compareTo(4) == 0){
            return streamToOSS(file.getInputStream(),
                    baseConstant.getAliOSSAPPImgFilePath()+"/"+ SnowflakeIdWorker.uniqueSequenceStr()+originalFilename);
        }*/
        /*if(type.compareTo(5) == 0){
            return streamToOSS(file.getInputStream(),
                    baseConstant.getAliOSSAPPSysPath()+"/"+ SnowflakeIdWorker.uniqueSequenceStr()+originalFilename);
        }*/
        return null;
    }

    /**
      * @description: 向OSS上传文件流
      * @auther: create by singer - 王 浩 email:313402703@qq.com
      * @date 2019-09-18
      * @param inputStream 文件流
      * @param fileName 文件名称
      * @return String
      */
    public String streamToOSS(InputStream inputStream,String fileName){
        // Endpoint以杭州为例，其它Region请按实际情况填写。
        // 云账号AccessKey有所有API访问权限，建议遵循阿里云安全最佳实践，创建并使用RAM子账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建。
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(baseConstant.getAliOSSEndPoint(), baseConstant.getAliAccessKeyId(), baseConstant.getAliAccessKeySecret());

        //执行上传文件
        PutObjectResult putObjectResult = ossClient.putObject(baseConstant.getAliOSSAppBucketName(), fileName, inputStream);

        // 关闭OSSClient。
        ossClient.shutdown();

        return fileName;
    }


    /**
      *
      * @description: 拿到文件的访问路径
      * @auther: create by singer - 王 浩 email:313402703@qq.com
      * @date 2019-09-18
      * @param name 文件名称 其实这个就是文件在OSS上面的路径
      * @return String 文件访问的URL路径
      */
    public String getObjectAccessUrl(String name) throws Exception{
        // Endpoint以杭州为例，其它Region请按实际情况填写。
        // 云账号AccessKey有所有API访问权限，建议遵循阿里云安全最佳实践，创建并使用RAM子账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建。
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(baseConstant.getAliOSSEndPoint(), baseConstant.getAliAccessKeyId(), baseConstant.getAliAccessKeySecret());

        // 设置URL过期时间为1小时。
        Date expiration = new Date(new Date().getTime() + 3600 * 1000);
        // 生成以GET方法访问的签名URL，访客可以直接通过浏览器访问相关内容。
        URL url = ossClient.generatePresignedUrl(baseConstant.getAliOSSAppBucketName(), name, expiration);

        // 关闭OSSClient。
        ossClient.shutdown();

        return url.toURI().toString();
    }



}
